package com.xhui.vimarket.common.utils.collection;

import java.util.Collection;
import java.util.Iterator;

public interface VimarketCollection<E> extends Collection<E> {

    
    /**
     * 添加元素到初始数据中。
     */
    boolean addInitial(E e);
    
    /**
     * 从初始数据中删除元素。
     */
    boolean removeDirectly(E e);
    
    /**
     * 添加元素集合到初始数据中。
     */
    boolean addInitial(Collection<? extends E> c);
    
    /**
     * 更新元素状态。
     */
    void update(E element);
    
    /**
     * 根据属性名和属性值，从集合中获取满足条件的元素。
     */
    E getByProperty(String propertyName, Object propertyValue);
    
    /**
     * 根据属性名和属性值，从集合中获取满足条件的所有元素。
     */
    Collection<E> getCollectionByProperty(String propertyName, Object propertyValue);
    
    /**
     * 获得有效集合信息，包含保留集合和新增集合。
     * 
     * @return 返回有效集合
     */
    Collection<E> getAll();
    
    /**
     * 获取有效集合信息的Iterator。
     */
    Iterator<E> getAllIterator();
    
    /**
     * 获得初始集合信息（updates + initials）。
     * 
     * @return 返回保留集合 
     */
    Collection<E> getRetains();
    
    /**
     * 获取初始集合信息（updates + initials）的Iterator。
     */
    Iterator<E> getRetainsIterator();
    
    /**
     * 获得新增的集合信息。
     */
    Collection<E> getAdds();
    
    /**
     * 获取新增集合的Iterator。
     */
    Iterator<E> getAddsIterator();
    
    /**
     * 获得删除的集合信息。
     */
    Collection<E> getRemoves();
    
    /**
     * 获取删除集合的Iterator。
     */
    Iterator<E> getRemovesIterator();
    
    /**
     * 获得更新的集合信息。
     */
    Collection<E> getUpdates();
    
    /**
     * 获取更新集合的Iterator。
     */
    Iterator<E> getUpdatesIterator();
    
    /**
     * 获得初始集合中无更新信息。
     */
    Collection<E> getInitials();
    
    /**
     * 获取初始集合中无更新信息的Iterator。
     */
    Iterator<E> getInitialsIterator();
    
    /**
     * 清理所有数据：
     * 1. 将“新增数据”转移到“初始数据”；
     * 2. 将“删除数据”清空；
     */
    void initialAllData();
    /**
     * {@inheritDoc}
     * 
     * 顺序执行以下步骤：
     * 1. 将所有标志位非ElementStateFlag.ADDED的元素，添加到“deletionData”；
     * 2. 删除有效数组中的所有元素。
     */
    void removeAll();
    /**
     * 将所有数据还原.
     * 1.还原删除的数据
     * 2.删除新增的数据
     * 3.清除更新的数据
     */
    void restoreAllData();

}
